package bddaccess;

import java.util.ArrayList;
import java.util.List;

import modex.Document;
import modex.Terme;
import modex.TermePara;

public class BDDAccess {

    // Permet de stocker la taille du lot pour l'insertion multiple en bdd
    private static final int TAILLE_LOT_INSERT_BDD = 10000; 
    
    // Fonction générique d'insertion multiple en base
    public void insertMultipleBDD(ArrayList<?> elements){
    	if (elements.size() > 0){
    		
    		// Sous listes de X éléments 
    		// (exemple : si on veut insérer 1000 par 1000 on doit découper les listes en sous listes de 1000 éléments pour pouvoir insérer)
    		ArrayList<List<?>> subLists = new ArrayList<List<?>>(); 
    		
    		/* CALCUL DU NOMBRE D'ITERATIONS (Nb de sous listes)*/
    		
    		// On arrondit à l'entier supérieur le ratio (nbElem/tailleLotInsertion)
        	// Exemple : Si on a 4325 éléments : (elements.size / 1000) = 4
        	// Mais on veut le faire 5 fois sinon les 325 derniers éléments ne seront pas pris en compte
    		// On utilise donc la méthode ceil qui permet de faire ça
        	int nbIteration = (int) Math.ceil((double)elements.size() / (double)TAILLE_LOT_INSERT_BDD); 
    		
        	/* CREATION DES SOUS LISTES D'ELEMENTS */
        	
        	// On doit découper la liste en sous listes et insérer le nombre de fois nécessaire
        	for (int i = 0 ; i < nbIteration ; i++){
        		
        		// Définition des délimiteurs pour découper la liste
        		int fromIndex = i*TAILLE_LOT_INSERT_BDD;
        		int toIndex;
        		
        		if (elements.size() < (i+1)*TAILLE_LOT_INSERT_BDD){
        			toIndex = elements.size();
        		} else {
        			toIndex = (i+1)*TAILLE_LOT_INSERT_BDD;
        		}

        		// On récupère la sous liste des éléments que l'on veut insérer (1000 premiers, 1000 suivants, etc...)
        		subLists.add(elements.subList(fromIndex,toIndex));


        	}

        	/* INSERTION MULTIPLE EN BASE EN FONCTION DE L'ELEMENT */

    		if (elements.get(0).getClass() == modex.Document.class){
    			
    			DAO<Document> documentDao = DAOFactory.getDocumentDAO();
    			
    			for (int i = 0 ; i < nbIteration ; i++){
	    	        documentDao.createMultiple(new ArrayList(subLists.get(i)), TAILLE_LOT_INSERT_BDD);
    			}
    			
    		} else if (elements.get(0).getClass()== modex.Paragraphe.class){
    			
    			ParagrapheDAO paraDao = DAOFactory.getParagrapheDAO();
    			ParagrapheDAO pDAO = DAOFactory.getParagrapheDAO();
    			pDAO.nbParagraphes();
    		
    			for (int i = 0 ; i < nbIteration ; i++){
	    	        paraDao.createMultiple(new ArrayList(subLists.get(i)), TAILLE_LOT_INSERT_BDD);
    			}
    			
    		} else if (elements.get(0).getClass() == modex.TermePara.class){
    			
    			DAO<TermePara> termeParaDao = DAOFactory.getTermeParaDAO();
    			
    			for (int i = 0 ; i < nbIteration ; i++){
    				termeParaDao.createMultiple(new ArrayList(subLists.get(i)), TAILLE_LOT_INSERT_BDD);
    			}
    			
    		} else if (elements.get(0).getClass() == modex.Terme.class){
    			DAO<Terme> termeDao = DAOFactory.getTermeDAO();
    			
    			for (int i = 0 ; i < nbIteration ; i++){
    				termeDao.createMultiple(new ArrayList(subLists.get(i)), TAILLE_LOT_INSERT_BDD);
    			}
    		}
    	}
    }
}
